/**
 * 封装uni-app请求工具类
 */

// 基础请求地址
export const baseURL = 'http://localhost:8080'

// 请求拦截器
const interceptorsRequest = (config) => {
	// 获取token（如果有的话）
	const token = uni.getStorageSync('token')
	if (token) {
		config.header = {
			...config.header,
			'X-Authorization': `Bearer ${token}`
		}
	}
	return config
}

// 响应拦截器
const interceptorsResponse = (response) => {
	const { statusCode, data } = response

	// 请求成功
	if (statusCode >= 200 && statusCode < 300) {
		return data
	}

	// 处理错误情况
	switch (statusCode) {
		case 401:
			// token过期或未登录
			uni.showToast({
				title: '请先登录',
				icon: 'none'
			})
			// 可以在这里处理登录过期逻辑
			break
		case 403:
			uni.showToast({
				title: '没有权限',
				icon: 'none'
			})
			break
		case 404:
			uni.showToast({
				title: '请求资源不存在',
				icon: 'none'
			})
			break
		default:
			uni.showToast({
				title: data.message || '请求失败',
				icon: 'none'
			})
	}

	return Promise.reject(response)
}

/**
 * 封装请求方法
 * @param {String} method - 请求方法
 * @param {String} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他选项
 */
const request = (method, url, data = {}, options = {}) => {
	// 组合完整请求地址
	const requestUrl = /^(http|https):\/\//.test(url) ? url : baseURL + url

	// 合并请求配置
	const config = {
		url: requestUrl,
		method: method.toUpperCase(),
		header: {
			'Content-Type': 'application/json',
			...options.header
		},
		...options
	}

	// GET请求使用params参数
	if (method.toUpperCase() === 'GET') {
		config.data = data
	} else {
		config.data = data
	}

	// 应用请求拦截器
	const finalConfig = interceptorsRequest(config)

	// 发送请求
	return new Promise((resolve, reject) => {
		uni.request({
			...finalConfig,
			success: (response) => {
				resolve(interceptorsResponse(response))
			},
			fail: (error) => {
				uni.showToast({
					title: '网络请求失败',
					icon: 'none'
				})
				reject(error)
			}
		})
	})
}

// 导出各种请求方法
export default {
	// GET请求
	get(url, params = {}, options = {}) {
		return request('GET', url, params, options)
	},

	// POST请求
	post(url, data = {}, options = {}) {
		return request('POST', url, data, options)
	},

	// PUT请求
	put(url, data = {}, options = {}) {
		return request('PUT', url, data, options)
	},

	// DELETE请求
	delete(url, data = {}, options = {}) {
		return request('DELETE', url, data, options)
	},

	// PATCH请求
	patch(url, data = {}, options = {}) {
		return request('PATCH', url, data, options)
	}
}
